package controller

import (
	"html/template"
	"net/http"
	"web08_35_tushu/dao"
	"web08_35_tushu/model"
	"web08_35_tushu/utils"
)

//Login 处理用户登录
func Login(w http.ResponseWriter, r *http.Request) {
	//避免重复登录,先判断是否已登录
	flag, _ := dao.IsLogin(r)
	if flag {
		//已登录
		//直接去首页
		GetPageBooksByPrice(w, r)
	} else {

		//获取用户名和密码
		username := r.PostFormValue("username")
		password := r.PostFormValue("password")

		user, _ := dao.CheckUserNameAndPassword(username, password)

		//这里user是一个结构体指针，如果是结构体的话下面的!=nil就会报错，因为结构体的空是(User{})
		if user.ID > 0 {
			//用户账号密码正确
			//生成uuid
			uuid := utils.CreateUUID()
			//将uuid作为session的唯一id
			sess := &model.Session{
				SessionID: uuid,
				UserName:  user.Username,
				UserID:    user.ID,
			}
			//添加进数据库
			dao.AddSession(sess)
			//创建一个cookie，用户通过cookie关联session
			cookie := http.Cookie{
				Name:     "user",
				Value:    uuid, //通过uuid来找到对应session
				HttpOnly: true,
			}
			//最后把cookie发给用户
			http.SetCookie(w, &cookie)

			t := template.Must(template.ParseFiles("pages/user/login_success.html"))
			t.Execute(w, user)
		} else {
			//用户账号密码错误
			t := template.Must(template.ParseFiles("pages/user/login.html"))
			t.Execute(w, "用户用户名或密码错误")
		}
	}

}

//Regist 处理用户注册
func Regist(w http.ResponseWriter, r *http.Request) {
	//获取用户输入信息
	username := r.PostFormValue("username")
	password := r.PostFormValue("password")
	email := r.PostFormValue("email")

	user, _ := dao.CheckUserName(username)
	//这里user是一个结构体指针，如果是结构体的话下面的!=nil就会报错，因为结构体的空是(User{})
	if user.ID > 0 {
		//用户名已存在
		t := template.Must(template.ParseFiles("pages/user/regist.html"))
		t.Execute(w, "用户名已存在！")
	} else {
		//用户账号可以注册
		dao.SaveUser(username, password, email)
		t := template.Must(template.ParseFiles("pages/user/regist_success.html"))
		t.Execute(w, "")
	}
}

//CheckUserName Ajax请求检测用户名是否可用
func CheckUserName(w http.ResponseWriter, r *http.Request) {
	username := r.PostFormValue("username")
	// user,_:=dao.CheckUserName
	// fmt.Println("用户传过来的值是：", username)
	user, _ := dao.CheckUserName(username)
	//这里user是一个结构体指针，如果是结构体的话下面的!=nil就会报错，因为结构体的空是(User{})
	if user.ID > 0 {
		//用户名已存在
		w.Write([]byte("用户名已存在！"))
	} else {
		//用户账号可以注册
		w.Write([]byte("<font style='color:green'>用户名可用！</font>"))
	}
}

//Logout 删除session
func Logout(w http.ResponseWriter, r *http.Request) {
	//根据名字获取cookie
	cookie, _ := r.Cookie("user")
	if cookie != nil {
		//把cookie里的值拿出来
		cookieValue := cookie.Value
		//删除数据库中对应的session
		dao.DeleteSession(cookieValue)
		//设置cookie立即失效
		cookie.MaxAge = -1
		//把cookie发送给浏览器
		http.SetCookie(w, cookie)
	}
	GetPageBooksByPrice(w, r)
}
